<?php
/**
 * Classe para geração dos Relatórios do Sistema
 * @author bruno
 * @since 07/05/2010
 */
class TRelatorio
{
    private $title; // Título do Relatório
    private $html = ''; // HTML do Relatório
    private $content; // HTML do Conteúdo
    private $pdfName = 'relatorio';
    private $pdfPaper = 'portrait';
    
    public $showHeader = TRUE; // Exibir Cabeçalho
    public $showFooter = TRUE; // Exibir Rodapé
    public $showDate = TRUE; // Exibe a Data de Emissão do Relatório
    public $showPDFButton = FALSE; //Exibe o Botão de PDF;
    
    /**
     * Prepara o HTML do relatório
     * @return void
     */
    private function prepare()
    {
        $this->renderHTMLBegin();
        $this->renderHeader();
        $this->renderBody();
        $this->renderFooter();
        $this->renderPDFButton();
        $this->renderHTMLEnd();
    }
    
    /**
     * Renderiza e exibe o relatório
     * @return void
     */
    public function render()
    {
        if ($this->isRequestedPDF()) {
            $this->renderPDF();
        }
        else {
            $this->renderHTML();    
        }
    }
    
    /**
     * Renderiza o HTML do relatório
     * @return void
     */
    public function renderHTML()
    {
        $this->prepare();
        echo $this->html;
    }
    
    /**
     * Renderiza o relatório em PDF
     * @return void
     */
    public function renderPDF()
    {
        $this->prepare();
        
        $pdf = new DOMPDF();
    	$pdf->load_html($this->html);
    	$pdf->set_paper('a4', $this->getPDFPaper());
    	$pdf->render();
    	$pdf->stream($this->getPDFName() . '.pdf');
    }
    
    /**
     * Renderiza o corpo do relatório
     * @return void
     */
    private function renderBody()
    {
        $this->html .= $this->content;
    }
    
    /**
     * Início do HTML
     * @return void
     */
    private function renderHTMLBegin()
    {
        $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
				  <html xmlns="http://www.w3.org/1999/xhtml">
					  <head>
					      <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
        				  <title>SGC - Sistema de Gestão de Contratos</title>
        				  <link href="../../template/css/relatorio.css" rel="stylesheet" type="text/css" />
    				  </head>
    				  <body>';
        
        $this->html .= $html;
    }
    
    /**
     * Final do HTML
     * @return void
     */
    private function renderHTMLEnd()
    {
        $html = '	  </body>
    			  </html>';
        
        $this->html .= $html;
    }
    
    /**
     * Cabecalho
     * @return void
     */
    private function renderHeader()
    {
        $html  = '<table cellpadding="0" cellspacing="0" width="100%">';
        
        if ($this->showHeader) {
        	$html .= '<thead>
        			       <tr>
        			           <td>
        			               <div id="cabecalho">
            			               <table cellpadding="0" cellspacing="0" width="100%">
            			                   <tr>
            			                       <td width="200px" valign="middle">
            			                           <img src="../../template/img/fortaleza_relatorio.jpg" 
            			                               alt="Prefeitura Municipal de Fortaleza"/>
        			                           </td>
        			                           <td valign="middle" align="center">
            			               		       <h2>' . $this->getTitle() . '</h2>
        			               		       </td>
        			               		   </tr>
    		               		       </table>
    		               	       </div>
    			               </td>
			               </tr>
		               </thead>';
        }
        
        $html .= '    <tbody>
        			       <tr>
        			           <td>';
        
        $this->html .= $html;
    }
    
    /**
     * Rodapé
     * @return void
     */
    private function renderFooter()
    {
        $html  = '            </td>
        				   </tr>
        			   </tbody>';
        
        if ($this->showFooter) {
        	$html = '<tfoot>
					      <tr>
    			              <td>
    			                  <div id="rodape">
			                          Prefeitura Municipal de Fortaleza';
        	
        	if ($this->showDate) {
    		    $html .= '	          <span>
    		    					      Emitido em ' . date('d/m/Y') . ' às ' . date('H:i') . '
    		    					  </span>';
        	}

        	$html .= '	          </div>
        	                  </td>
			              </tr>
		              </tfoot>';
        }
        
        $html .= '</table>'; 
        
        $this->html .= $html;
    }
    
    /**
     * Botão de Gerar PDF
     * @return void
     */
    private function renderPDFButton()
    {
        if (!$this->showPDFButton OR $this->isRequestedPDF()) {
            return NULL;
        } 
        
        $html = '<form action="' . $this->getFormActionUrl() . '" method="post">
				      <p>
				          <button type="submit" name="method" value="pdf">Gerar PDF</button>
			          </p>
				  </form>';
        
        $this->html .= $html;
    }
    
    /**
     * Verifica se há um request para geração do PDF
     * @return boolean
     */
    private function isRequestedPDF()
    {
        return (isset( $_POST['method']) && $_POST['method'] == 'pdf');
    }
    
    /**
     * URL da Action do form de gerar PDF
     * @return string
     */
    private function getFormActionUrl()
    {
        return $_SERVER['REQUEST_URI'];
    }
    
    /**
     * Recupera o Título do relatório
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
    
    /**
     * Título do relatório
     * @param $title
     * @return void
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }
    
    /**
     * Conteúdo do relatório
     * @param $html
     * @return void
     */
    public function setContent($html)
    {
        $this->content = $html;
    }
    
    /**
     * Recupera o nome do arquivo PDF
     * @return string
     */
    public function getPDFName()
    {
        return $this->pdfName;
    }
    
    /**
     * Nome do arquivo PDF
     * @param $name
     * @return void
     */
    public function setPDFName($name)
    {
        $this->pdfName = $name;
        $this->showPDFButton = TRUE;
    }
    
    /**
     * Recupera o tipo de papel (retrato/paisagem) do PDF
     * @return string
     */
    public function getPDFPaper()
    {
        return $this->pdfPaper;
    }
    
    /**
     * Tipo de papel (retrato/paisagem) do PDF
     * @param $paper
     * @return void
     */
    public function setPDFPaper($paper)
    {
        $this->pdfPaper = $paper;
    }
}